Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

205
Visualizações
¿Cómo transferir "esto" de un componente a otros?

Tengo un componente (Component1) al que quiero llamar una función de otro (en este caso, la aplicación principal). Mi pregunta es por qué la función onClickMe no puede acceder a this desde el componente de la App .

 class Component1 extends React.Component { render() { return ( <div> <h5>sub Component 1 </h5> <button onClick={() => this.props.data[0].action("foo")}> Click Me! </button> </div> ); } } class App extends React.Component { constructor(props) { super(props); this.state = { clicked: false }; this.onClickMe = this.onClickMe.bind(this); } data = [{ name: "Giordano", action: this.onClickMe }]; onClickMe(value) { /// I can get the correct value here console.log(value); /// THIS IS THE PROBLEM. /// "this" here refers to the object `data` not App /// so there is no 'setState' function on this this.setState({ clicked: true }); } render() { return ( <div> <h1>Main page</h1> <Component1 data={this.data} /> </div> ); } }

el ejemplo de código: https://codesandbox.io/s/react-playground-forked-99kumd?file=/index.js

about 4 years ago · Juan Pablo Isaza
2 Respostas
Responde à pergunta

0

Explicaré por qué sucede esto y agregaré algunos comentarios, pero primero, aquí está el código que funciona como espera:

 import React from "react"; import ReactDOM from "react-dom"; class Component1 extends React.Component { render() { return ( <div> <h5>sub Component 1 </h5> <button onClick={() => this.props.onClick("foo")}>Click Me!</button> </div> ); } } class App extends React.Component { constructor(props) { super(props); this.state = { clicked: false }; } // This syntax lets you get rid of .bind in constructor and just binds the method for you onClickMe = (value) => { console.log(this); console.log(value); this.setState({ clicked: true }); }; render() { return ( <div> <h1>Main page</h1> {/* It is better to pass props one by one, this way you can see what exactly you are passing */} <Component1 name="Giordano" onClick={this.onClickMe} /> </div> ); } } ReactDOM.render(<App />, document.getElementById("container"));

Estaba usando "datos" como un campo de instancia de clase pública ; en pocas palabras, su línea de asignación de "datos" se ejecutó antes del cuerpo del constructor, por lo que la función onClickMe aún no estaba vinculada cuando la asignó a la acción dentro del objeto de datos.

Otras cosas no son esenciales, son solo comentarios.

Puede declarar onClickMe como función de flecha, que es una sintaxis de campo de clase especial que le permite deshacerse de .bind

No necesita "datos" en absoluto; simplemente puede pasar los accesorios directamente al componente secundario. De esa manera no tendrías el problema de perder "esto" en primer lugar :)

about 4 years ago · Juan Pablo Isaza Relatório

0

Mueva la declaración data = [{ name: "Giordano", action: this.onClickMe }] , dentro del constructor, de esa manera, this se referirá al componente de la App , así:

 import React from "react"; import ReactDOM from "react-dom"; class Component1 extends React.Component { render() { console.log(this.props); return ( <div> <h5>sub Component 1 </h5> <button onClick={() => this.props.data[0].action("foo")}> Click Me! </button> </div> ); } } class App extends React.Component { constructor(props) { super(props); this.state = { clicked: false }; this.onClickMe = this.onClickMe.bind(this); this.data = [{ name: "Giordano", action: this.onClickMe }]; } // data = [{ name: "Giordano", action: this.onClickMe }]; onClickMe(value) { /// I can get the correct value here console.log("This ", this); /// THIS IS THE PROBLEM. /// "this" here refers to the object `data` not App /// so there is no 'setState' function on this this.setState({ clicked: true }); } render() { console.log(this.state.clicked); return ( <div> <h1>Main page</h1> <Component1 data={this.data} /> </div> ); } } ReactDOM.render(<App />, document.getElementById("container"));

Aquí está el enlace del parque infantil.

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda